Misaghlb

بلاگ من

از sudo npm استفاده نکنیم

توی این پست میخونیم که چرا نباید npm را با دسترسی روت اجرا کرد و چه خطری داره و در پایان هم میبینیم که راه حل چیه.

برای نصب Node و Npm چندین روش وجود داره :

خب دو روش اول امن هستند و نیازی به استفاده از sudo ندارن ولی راه حل سوم، راه ترین روش هست ولی امن ترین روش نیست. چرا؟

چون اگر بخواهید پکیجی را بصورت گلوبال نصب کنید مجبورید دسترسی روت رو هم بهش بدید برای مثال:

1
sudo npm install -g hexo

چه مشکلی داره ؟

در کل شما تا جایی که میتونید و ضروری نیست نباید برنامه ها رو با دسترسی روت اجرا کنید. در اینجا هم node و npm هم بدون دسترسی ادمین میتونن به درستی کار کنند. حالا اگر دسترسی روت بهشون بدیم مثلا سرور رو با روت اجرا کنیم ، اگر روزی سرور هک شد هکر میتونه به تمام سیستم دسترسی پیدا کنه.

راه حل چیه؟

خوشبختانه چندتا راه حل ساده داره :

راه حل اول: تغییر پرمیژن دایرکتوری پیشفرض npm

اول با این دستور دایرکتوری پیشفرض رو پیدا میکنیم:

1
npm config get prefix

برای بیشتر سیستم ها خروجی اینه : usr/local/ .

اگر خروجی شما usr/ بود این راه رو ادامه ندید و به روش دوم برید.

حالا کافیه تا با این دستور owner دایرکتوری ها رو به یوزر خودتون تغییر بدید:

1
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

راه حل دوم‌: تغییر دایرکتوری پیشفرض

شاید گاهی اوقات نخواهید که طبق روش بالا owner پوشه ها رو تغییر بدین مثلا اگر از سیستمی استفاده میکنید که چند یوزر داره با تغییر مالک دایرکتوری ها، بقیه یوزرها به مشکل برمیخورند.

توی این روش، یک دایرکتوری مخفی توی هوم درست میکنیم و به npm میگیم که از این به بعد این مسیر درسته.

یک دایرکتوری توی هوم درست میکنیم:

1
mkdir ~/.npm-global

به npm میگیم این مسیر جدید هست:

1
npm config set prefix '~/.npm-global'

حالا توی فایل ‎~/.profile ‎ این خط رو اضافه میکنیم:‌(اگر وجود نداشت درستش کنین)

1
export PATH=~/.npm-global/bin:$PATH

خب تموم شد حالا برای تست میتونین یک پکیج بصورت گلوبال دانلود کنین:

1
npm install -g jshint

راه حل سوم:

راه حل سوم هم برای مک هستش که اگر تازه میخواین node رو نصب کنین میتونین از Homebrew استفاده کنین که بطور خودکار با پرمیژن های صحیح براتون نصبش میکنه.

1
brew install node

امیدوارم مفید بوده باشه. 😉 😉